<ES6>函数
简介
- ES6在ES5的基础上做了大量改进,使编程更加灵活,更少出错。
 
参数默认值
- ES5非严格模式下,命名参数的变化会体现在arguments对象中
 
1  | function a(b,c) {  | 
- ES5严格模式下取消了对于arguments对象的同步行为
 
1  | function a(b,c) {  | 
1  | function defaultParam(a,b=1) {  | 
- 默认参数对arguments的影响(在ES6中如果一个函数使用了默认值,无论是否显示定义严格模式,arguments与ES5严格模式保持一致)
 
1  | function Fun(a,b=1) {  | 
默认参数表达式
- 注意如果忘记写小括号,则传入默认函数的引用
 
1  | let num = 1  | 
- 可以使用先定义的参数作为后定义参数的默认值(但是反过来的话会产生临时死区TDZ)
 
1  | function add(first,second = first) {  | 
- 参数的默认值不能访问函数体内声明的变量(参数和函数体的作用域相互独立)
 
处理无命名参数
不定参数
- 使用限制:
 
- 每个函数只能声明一个不定参数 2、不定参数必需放在所有参数的末尾
 
- 不定参数对arguments的影响:无论是否使用不定参数,arguments对象总是包含所有传入的参数
 
1  | function pick(object,...keys) {  | 
- 对象的setter只能包含一个参数
 
1  | let obj = {  | 
Function构造函数增强
1  | let Funaa = new Function('a=1','...nums','console.log(a+nums[0])')//11(字符串)  | 
展开运算符
- 指定数组,打散后作为参数传入函数
 
1  | let numArr= [1,2,3]  | 
name属性
- 函数表达式的属性名字比函数赋值的变量权重高
 - getter函数名字有get
 - 调用bind生成函数名字有bound
 
1  | function name2() {  | 
明确函数的多用途
- ES5中判断函数被调用的方法,但是通过Person.call()或者Person.apply()方法调用就无法判断
 
1  | function Person(name) {  | 
- 函数有[[Call]]和[[Construct]]方法,分表表示直接调用和new构造
 - 元属性new.target(判断函数是否通过new关键字调用)
 
1  | function bbb() {  | 
块级函数
- ES5中处理块级函数,ES5严格模式中代码块内声明函数会报错
 
1  | 'use strict'  | 
- ES6严格模式下块级函数(代码中块级函数会被提升至块的顶部,而使用let声明的变量不会)
 
1  | if(true){  | 
- ES6非严格模式下,函数提升至外围函数或全局作用域的顶部
 
1  | if(true){  | 
箭头函数
- 没有this\super\arguments\ner.target绑定,箭头函数中的这些由外层最近一个非箭头函数决定
 - 不能通过new关键字调用
 - 没有原型
 - 不可改变this指向
 - 不支持arguments对象
 - 不支持重复命名参数
 
1  | let reflec = val=>val//直接返回val  | 
多个箭头的函数与科里化
1  | var a = b => c => d => {  | 
尾调用优化
- 尾调用指的是函数作为另一个函数的最后一条语句被执行
 - ES6缩减了严格模式下尾调用栈的大小,如果满足以下条件,尾调用不在创建新栈,而是清除并重用当前栈。
 - 需要同时满足:
 
- 尾调用不访问当前函数的变量
 - 在函数内部,尾调用是最后一条语句
 - 尾调用的结果作为函数的返回值
 
- 适用于递归函数
 
1  | function factorial(n,p=1) {  |